use tun_tap::Iface;
use std::io::{self, Read, Write};
use std::net::UdpSocket;

fn main() -> io::Result<()> {
    let tun = Iface::new("tun0", tun_tap::Mode::Tun)?;
    println!("TUN 设备 {} 创建成功", tun.name());

    let socket = UdpSocket::bind("10.0.0.1:8888")?;
    println!("UDP 套接字绑定成功");

    let mut buffer = [0; 65535];
    loop {
        // 从 UDP 套接字接收数据
        let (n, addr) = socket.recv_from(&mut buffer)?;
        println!("从 {} 接收到 {} 字节的数据", addr, n);

        // 将接收到的数据发送到 TUN 设备
        tun.send(&buffer[0..n])?;

        // 从 TUN 设备读取数据
        let n = tun.recv(&mut buffer)?;
        println!("从 TUN 设备读取到 {} 字节的数据", n);

        // 可以对 TUN 设备的数据进行处理
        // 这里简单地将数据原样发送回 UDP 客户端
        socket.send_to(&buffer[0..n], addr)?;
    }
}